package com.csw.android.player.base

import androidx.lifecycle.MutableLiveData

/**
 * 播放列表，用于控制媒体列表的播放顺序，循环模式等等
 *
 * @param mediaPlayer 媒体播放器，本播放列表的媒体将通过此播放器实例进行播放
 */
class PlayList(private val mediaPlayer: IMediaPlayer) {

    /**自动播放下一个，默认为true*/
    var autoPlayNext = true

    /**媒体列表实时数据，订阅以获取媒体列表的实时变化*/
    val data = MutableLiveData<ArrayList<MediaInfo>?>(null)

    /**当前播放的媒体，订阅以获取当前播放媒体的实时变化*/
    val currMedia = MutableLiveData<MediaInfo?>(null)

    /**更新播放媒体列表*/
    fun setList(list: List<MediaInfo>?) {
        (data.value ?: ArrayList()).run {
            clear()
            list?.let {
                addAll(it)
            }
            data.postValue(this)
        }
    }

    /**自动播放下一个，若[autoPlayNext]状态不为true，则不播放下一个，用于播放器播放结束或者错误时，要播放下个媒体使用*/
    fun autoPlayNext() {
        if (!autoPlayNext) {
            return
        }
        playNext()
    }

    /**
     * 时候含有下一个媒体
     */
    fun hasNext():Boolean{
        val list = data.value
        return !list.isNullOrEmpty()
    }

    /**
     * 播放下一个，根据循环模式与当前媒体位置，切换下一个播放媒体
     */
    fun playNext() {
        val list = data.value
        if (list.isNullOrEmpty()) {
            return
        }
        var currIndex = list.indexOf(currMedia.value)
        currIndex++
        if (currIndex >= list.size) {
            currIndex = 0
        }
        mediaPlayer.mediaInfo = list[currIndex]
        mediaPlayer.play()
    }

    /**
     * 时候含有上一个媒体
     */
    fun hasPrevious():Boolean{
        val list = data.value
        return !list.isNullOrEmpty()
    }

    /**
     * 播放上一个，根据循环模式与当前媒体位置，切换上一个播放媒体
     */
    fun playPrevious() {
        val list = data.value
        if (list.isNullOrEmpty()) {
            return
        }
        var currIndex = list.indexOf(currMedia.value)
        currIndex--
        if (currIndex < 0) {
            currIndex = list.size - 1
        }
        if (currIndex >= list.size) {
            currIndex = 0
        }
        mediaPlayer.mediaInfo = list[currIndex]
        mediaPlayer.play()
    }

    fun playCurrent(){
        mediaPlayer.mediaInfo = currMedia.value
        mediaPlayer.play()
    }

}